package com.sms.util;

import java.util.InputMismatchException;
import java.util.Scanner;

/**
 * 控制台输入工具类
 * 位置：com.sms.util.InputUtil
 */
public final class InputUtil {
    /**
     * 获取字符串输入
     *
     * @param prompt 提示信息
     * @return 用户输入的字符串
     */
    public static String getStringInput(String prompt) {
        Scanner sc = new Scanner(System.in);
        System.out.print(prompt);
        return sc.nextLine();
    }

    /**
     * 获取整数输入
     *
     * @param prompt 提示信息
     * @return 用户输入的整数
     * @throws InputMismatchException 当输入不是整数时抛出
     */
    public static int getIntInput(String prompt) throws InputMismatchException {
        Scanner sc = new Scanner(System.in);
        System.out.print(prompt);

        try {
            int num = sc.nextInt();
            sc.nextLine();
            return num;
        } catch (InputMismatchException e) {
            sc.nextLine();
            throw new InputMismatchException("输入数据不为整数！");
        }
    }

    /**
     * 获取范围内的整数输入
     *
     * @param prompt 提示信息
     * @param min    最小值
     * @param max    最大值
     * @return 用户输入的整数
     * @throws IllegalArgumentException 当输入超出范围时抛出
     */
    public static int getIntInput(String prompt, int min, int max) throws IllegalArgumentException {
        int num = getIntInput(prompt);

        if (num < min || num > max) {
            throw new IllegalArgumentException("输入数字超出范围！");
        }

        return num;
    }

    /**
     * 获取浮点数输入
     *
     * @param prompt 提示信息
     * @return 用户输入的浮点数
     * @throws NumberFormatException 当输入不是数字时抛出
     */
    public static double getDoubleInput(String prompt) throws NumberFormatException {
        System.out.print(prompt);
        Scanner sc = new Scanner(System.in);

        try {
            double num = sc.nextDouble();
            sc.nextLine();
            return num;
        } catch (NumberFormatException e) {
            sc.nextLine();
            throw new NumberFormatException("输入数据不为浮点数！");
        }
    }

    /**
     * 获取菜单选择
     *
     * @param options 菜单选项数组
     * @return 用户选择的选项索引（从0开始）
     */
    public static int getMenuChoice(String[] options) {
        // 显示菜单
        System.out.println("\n请选择操作：");
        for (int i = 0; i < options.length; i++) {
            System.out.printf("%d. %s\n", i + 1, options[i]);
        }

        // 获取选择
        return getIntInput("请输入选项数字(1-"
                + options.length + "):", 1, options.length) - 1;
    }
}